package java6681.regex;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.paint.Paint;
import javafx.stage.Stage;

/**
 * @author Junichiro
 * @description 正则表达式验证窗口
 * @date 2021-03-15 0:08
 **/

public class CheckRegex6681 extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Scene scene = new Scene(getRoot());
        primaryStage.setScene(scene);
        primaryStage.setTitle("验证正则表达式");
        primaryStage.show();
    }

    private Parent getRoot() {
        //显示每个人的学号和姓名
        Label lblStudent = new Label("212006681|张舒婷");
        BorderStroke bs = new BorderStroke(Paint.valueOf("#8FBC8F"),//边框的颜色
                BorderStrokeStyle.DOTTED,//边框的样式
                new CornerRadii(10),//边框四个角的圆角
                new BorderWidths(3));//边框的宽度
        lblStudent.setBorder(new Border(bs));//设置边框
        lblStudent.setPadding(new Insets(10));//设置边距

        //输入正则表达式的两个控件用水平排列
        HBox hRegex = new HBox(10);
        Label lblRegex = new Label("正则表达式：");
        TextField tfRegex = new TextField("");
        hRegex.getChildren().addAll(lblRegex, tfRegex);//添加两个控件
        hRegex.setAlignment(Pos.CENTER_LEFT);//垂直居中，水平靠左
        HBox.setHgrow(tfRegex, Priority.ALWAYS);//文本框的宽度填满剩余空间

        Label lblInput = new Label("输入要检验的一组字符串（用逗号分隔）");
        //多行文本框，输入一组要验证的字符串
        TextArea taInput = new TextArea("");
        taInput.setPrefRowCount(4);//4行
        taInput.setPrefColumnCount(20);//20列
        taInput.setWrapText(true);//允许自动换行

        Button button = new Button("验证字符串是否符合正则表达式");

        //用于输入的控件采用垂直排列
        VBox vInput = new VBox(20);
        //添加子节点
        vInput.getChildren().addAll(hRegex, lblInput, taInput, button);
        vInput.setPadding(new Insets(20.0));//设置边距
        vInput.setAlignment(Pos.CENTER);//对齐方式

        //列表显示验证结果
        ListView<String> lvPrint = new ListView<>();
        lvPrint.getItems().add("显示验证结果");

        //水平排列：左边输入，右边显示结果
        HBox hBox = new HBox();
        hBox.getChildren().addAll(vInput, lvPrint);

        //垂直排列的根节点
        VBox root = new VBox(20);//节点之间的垂直间距20
        //为根节点添加子节点
        root.getChildren().addAll(lblStudent, hBox);
        root.setPadding(new Insets(20.0));//设置根节点的边距
        root.setAlignment(Pos.TOP_CENTER);//根节点中各节点的对齐方式
        root.setStyle("-fx-font-size:20");//用CSS样式设置容器中所有节点的字体大小

        button.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                /*读取单行文本框中输入的正则表达式*/
                String regex = tfRegex.getText();
                /*读取多行文本框中输入的字符串---->strInput变量*/
                String strInput = taInput.getText();
                /*用逗号拆分字符串strInput---->inputs数组*/
                String[] inputs = strInput.split(",");
                /*创建一个String数组用于存放切割后的字符*/
                String[] arr = new String[inputs.length];
                /*清空ListView中已有的内容（提示：使用getItems().clear()）*/
                lvPrint.getItems().clear();
                /*for遍历一个一个判断是否符合正则表达式*/
                for (int i = 0; i < arr.length; i++) {
                    arr[i] = inputs[i];
                    boolean matches = arr[i].matches(regex);
                    lvPrint.getItems().add(arr[i] + "：" + matches);
                }
            }
        });
        return root;
    }
}
/*
 *测试用例：
 *  \d{4}-0?[1-9]|1[012]
 *  2018-10,2018-05,2018-5,12-2018,2018-14,11,2018,-12
 *
 *  [+-]?\d+\.\d*|\d*\.\d+
 *  3.8,0.3,.3,3.,.*.,.,+3.0,-0.3
 * */